/**********************************************************************************************************
** 驱动文件：	battery-H3GTA.c
** 驱动类型：	battery
** 设备名称：	电池检测
** 设备型号：	H3GTA
** 设备品牌：	常规品牌
** 设备协议：	Modbus
** 驱动描述：	在线电池电压、内阻、温度测量
** 生成日期：	2018-05-17 15:32:37
**********************************************************************************************************/
#include "Includes.h"


/**********************************************************************************************************
* 定义设备数据点变量结构
**********************************************************************************************************/
typedef struct{
	Var voltage;								//电压
	Var resistance;								//内阻
	Var temp;									//温度
	Var faultInfo;								//故障信息
}Data_Struct;									//定义变量结构


/**********************************************************************************************************
* 设备数据点变量属性声明
**********************************************************************************************************/
const static Var_Property_Def var_attr[] = {
	{
		FLOAT,
		0,
		READONLY,
		"voltage",
		"电压",
		"V",
		"蓄电池电压",
		0,
		0,
		"蓄电池电压过高",
		"蓄电池电压过低",
		0,
		0
	},
	{
		FLOAT,
		0,
		READONLY,
		"resistance",
		"内阻",
		"uΩ",
		"蓄电池内阻",
		0,
		0,
		"蓄电池内阻过高",
		"蓄电池内阻过低",
		0,
		0
	},
	{
		FLOAT,
		0,
		READONLY,
		"temp",
		"温度",
		"℃",
		"蓄电池温度",
		0,
		0,
		"蓄电池温度过高",
		"蓄电池温度过低",
		0,
		0
	},
	{
		OCTSTR,
		0,
		READONLY,
		"faultInfo",
		"故障信息",
		"",
		"设备故障信息",
		0,
		0,
		"",
		"",
		0,
		0
	}
};


/**********************************************************************************************************
* 函数名称： static void cmd_fun(short index, int addr, void *data, char *cmd, short *len)
* 函数说明： 生成获取传感器数据指令
* 输入参数： 指令索引，传感器地址，变量结构体指针,以及指令缓存区指针,指令长度
* 返回参数： 无
**********************************************************************************************************/
static void cmd_fun(short index, int addr, void *data, char *cmd, short *len)
{
	switch(index)
	{
		case 0:
			cmd[0] = addr;
			cmd[1] = 0x03;
			cmd[2] = 0x00;								
			cmd[3] = 0x00;
			cmd[4] = 0x00;	
			cmd[5] = 0x07;
			*len = CRC16_Padding(cmd, 6);
			break;
		default:
			break;
	}
}


/**********************************************************************************************************
* 函数名称： static int parse_fun(short index, int addr, void *data, char *buf, short len)
* 函数说明： 解析传感器响应的数据，并写入数据库
* 输入参数： 解析索引,传感器地址，变量结构体指针，以及响应数据缓存取指针，响应数据长度
* 返回参数： 返回解析结果，返回0成功，返回1失败
**********************************************************************************************************/
static int parse_fun(short index, int addr, void *data, char *buf, short len)
{
	char flag=0;
	union{
		short 			dat16;
      	unsigned char  	dat8[2];
    }DAT16_8;						   //数据类型转换	
	Data_Struct 	*d = (Data_Struct*)data;
	
	if(buf!=NULL && buf[0]==addr && len>0 )
	{	
		if(CRC16_Check(buf,len))
		{	
			DAT16_8.dat8[1] = buf[5];
			DAT16_8.dat8[0] = buf[6];
			d->voltage.value.fnum 	= DAT16_8.dat16*0.001;
			DAT16_8.dat8[1] = buf[7];
			DAT16_8.dat8[0] = buf[8];
			d->temp.value.fnum 		= DAT16_8.dat16*0.1;
			DAT16_8.dat8[1] = buf[9];
			DAT16_8.dat8[0] = buf[10];			
			d->resistance.value.fnum= DAT16_8.dat16*1.0;
			
			DAT16_8.dat8[1] = buf[13];
			DAT16_8.dat8[0] = buf[14];
			if(DAT16_8.dat16==0x04){
				d->faultInfo.value.str	= "未找到温度传感器";
				flag = 1;
			}
			DAT16_8.dat8[1] = buf[15];
			DAT16_8.dat8[0] = buf[16];				
			if(DAT16_8.dat16==0x04){
				d->faultInfo.value.str	= "电压不在内阻测试范围内";
				flag = 1;
			}else if(DAT16_8.dat16==0x08){
				d->faultInfo.value.str	= "内阻测试过程放电电流异常";
				flag = 1;
			}
			DAT16_8.dat8[1] = buf[17];
			DAT16_8.dat8[0] = buf[18];				
			if(DAT16_8.dat16==0x01){
				d->faultInfo.value.str	= "继电器故障";
				flag = 1;
			}
			if(flag==0) d->faultInfo.value.str	= "无故障";
			Set_Var_Status(&d->faultInfo, flag?Alarm:Normal, NULL);	
		}
		return 0;
	}
	return 1;
}


/**********************************************************************************************************
* 函数名称： void battery_H3GTA_Registration(void)
* 函数说明： 电池检测驱动注册
* 输入参数： 无
* 返回参数： 无
**********************************************************************************************************/
void battery_H3GTA_Registration(void)
{
	Device_Registration(
		"battery",												//设备类型
		"电池检测",												//设备名称（导航栏默认显示名称）
		"H3GTA",												//设备型号
		"在线电池电压、内阻、温度测量",							//驱动描述
		var_attr,												//变量属性声明
		sizeof(Data_Struct),									//变量结构体空间大小
		cmd_fun,												//发送指令生成函数
		parse_fun												//数据解析函数
	);
}

